<?php
/**
 * このクラスが継承されている場合、インスタンスが一つであることを保証します。
 * 引数持てない。
 *
 * @author tanaka
 * @package Base
 * @subpakage Singleton
 */
abstract class Base_Singleton extends Base_Object
{
	private static $instance = array();

	/**
	 * コンストラクタ
	 * 
	 * @throws Exception
	 * @return void
	 */
	final private function __construct()
	{
		if (isset(self::$instance[get_called_class()])) {
			throw new Exception('インスタンスが複数作成されている。');
		}
		static::initialize();
	}

	/**
	 * コンストラクタで呼び出されるやつの実装
	 */
	protected function initialize()
	{}

	/**
	 * インスタンスの取得
	 * 
	 * @return instance of called
	 */
	final public static function getInstance()
	{
		$class = get_called_class();
		if (!isset(self::$instance[$class])) {
			self::$instance[$class] = new static();
		}
		return self::$instance[$class];
	}

	/**
	 * クローンの禁止
	 * 
	 * @throws Exception
	 */
	final private function __clone()
	{
		throw new Exception('インスタンスが複数作成されている。');
	}

}
